/* 
 * 文件名：ToolUtils.java  
 * 版权：Copyright 2016-2016 炎宝网络科技  All Rights Reserved by
 * 修改人：邱深友  
 * 创建时间：2016年11月26日
 * 版本号：v1.0
*/
package com.smartEdu.utils;

import java.security.MessageDigest;
import java.util.UUID;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.smartEdu.commons.LogCvt;

/**
 * 系统通用工具操作类
 * @author qsy
 * @version v1.0
 * @date 2016年11月26日
 */
public class ToolUtils {
	public static ObjectMapper objectMapper;
	
	/**
	 * 产生UUID串
	 * @return 32位字符
	 */
	public static String getUUID(){
		return UUID.randomUUID().toString().replaceAll("-","");
	}
	
	/**
	 * 随机产生6位数
	 * @return 验证码
	 */
	public static String getCode(){
		return String.valueOf(((int)((Math.random()*9+1)*100000)));
	}
	
	/**
	 * 对象序列化成json字符串
	 * @param obj 目标对象
	 * @return json字符串
	 */
	public static String toJson(Object obj){
		if (objectMapper == null) {  
			objectMapper = new ObjectMapper();  
		}
		try {
			return objectMapper.writeValueAsString(obj);
		} catch (JsonProcessingException ex) {
			LogCvt.error("序列化json对象失败",ex);
		}
		return "";
	}
	
	 /** 
     * 使用泛型方法，把json字符串转换为相应的JavaBean对象。 
     * (1)转换为普通JavaBean：readValue(json,Student.class) 
     * (2)转换为List,如List<Student>,将第二个参数传递为Student 
     * [].class.然后使用Arrays.asList();方法把得到的数组转换为特定类型的List 
     *  
     * @param jsonStr 
     * @param valueType 
     * @return 
     */  
    public static <T> T toObject(String jsonStr, Class<T> valueType) {  
        if (objectMapper == null) {  
            objectMapper = new ObjectMapper();  
        }  
        try {  
            return objectMapper.readValue(jsonStr, valueType);  
        } catch (Exception ex) {  
        	LogCvt.error("字符串转json对象失败",ex);
        }  
  
        return null;  
    }  
      
    /** 
     * json数组转List 
     * @param jsonStr 
     * @param valueTypeRef 
     * @return 
     */  
    public static <T> T toObject(String jsonStr, TypeReference<T> valueTypeRef){  
        if (objectMapper == null) {  
            objectMapper = new ObjectMapper();  
        }  
        try {  
            return objectMapper.readValue(jsonStr, valueTypeRef);  
        } catch (Exception ex) {  
        	LogCvt.error("字符串转json集合对象失败",ex); 
        }  
        return null;  
    }
	
    public final static String MD5(String pwd) {  
        //用于加密的字符  
        char md5String[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',  
                'A', 'B', 'C', 'D', 'E', 'F' };  
        try {  
            //使用平台的默认字符集将此 String 编码为 byte序列，并将结果存储到一个新的 byte数组中  
            byte[] btInput = pwd.getBytes();  
               
            //信息摘要是安全的单向哈希函数，它接收任意大小的数据，并输出固定长度的哈希值。  
            MessageDigest mdInst = MessageDigest.getInstance("MD5");  
               
            //MessageDigest对象通过使用 update方法处理数据， 使用指定的byte数组更新摘要  
            mdInst.update(btInput);  
               
            // 摘要更新之后，通过调用digest（）执行哈希计算，获得密文  
            byte[] md = mdInst.digest();  
               
            // 把密文转换成十六进制的字符串形式  
            int j = md.length;  
            char str[] = new char[j * 2];  
            int k = 0;  
            for (int i = 0; i < j; i++) {   //  i = 0  
                byte byte0 = md[i];  //95  
                str[k++] = md5String[byte0 >>> 4 & 0xf];    //    5   
                str[k++] = md5String[byte0 & 0xf];   //   F  
            }  
               
            //返回经过加密后的字符串  
            return new String(str);  
               
        } catch (Exception e) {  
            return null;  
        }  
    }
    
    public static void main(String[] args) {
		System.err.println(MD5("abc123abc").toLowerCase());
	}
}
